#ifndef CASILLERO_H
#define CASILLERO_H

#include "Excepcion.h"

class Casillero {
public:

    /**
     * Crea un casillero con las dimensiones indicadas y la posicion del vacio.
     */
    Casillero(short dimenciones, short posicionDeVacio) {
        this->dimenciones = dimenciones;
        posVacio = posicionDeVacio;
    }

    /**
     * Obtiene el valor en la posicion i del arreglo que representa el casillero.
     * @return valor contenido en la i-esima posicion del arreglo que representa
     * el casillero.
     * La posicion i-esima representa la casilla "i" del tablero y el valor de 
     * esta posicion indica que ficha contiene.
     */
    virtual char Info(int i) const = 0;

    /**
     * Intercambia la ficha vacia con la ficha que este en la casilla "pos".
     * @param pos
     */
    virtual void moverCero(int pos) = 0;

    /**
     * Dimencion ancho y alto del casillero.
     */
    virtual short Dimenciones() const = 0;

    /**
     * Posicion de la ficha "vacia".
     */
    virtual short Vacio() const = 0;

    /**
     * Clona el Casillero.
     */
    virtual Casillero *Clone() const = 0;

    /**
     * Retorna una representacion del casillero en String.
     * @param out: en out se guardara el string resultante, out debe tener
     * alojado suficiente espacio para almacenar la representacion del casillero.
     */
    virtual void toString(char *out) const = 0;

    /**
     * Retorna una representacion del casillero en String.
     * @return Un string alojado en memoria con la representacion del Casillero.
     */
    virtual char *toString() const = 0;

    virtual ~Casillero() {};
    
protected:
    short dimenciones;
    short posVacio;
};
#endif  /* CASILLERO_H */

